package br.com.werp.regras.suporte.integracao;

import br.com.werp.regras.geral.ErroPadrao;
import br.com.werp.regras.geral.integracao.MasterDAO;
import br.com.werp.regras.geral.util.Constantes;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.suporte.EmpresaVO;
import br.com.werp.regras.geral.vos.tabelas.Empresa;

import java.sql.Connection;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;


/**
 * @author Sobreira
 * Created on 16/09/2004
 */
public class EmpresasDAO extends MasterDAO {
    private static final String OBTER_EMPRESA = "OBTER_EMPRESA";
    private static final String EMPRESA_ID = "EMPR_ID";
    private static final String EMPRESA_DESCRICAO = "EMPR_DESCRICAO";
    private static final String OBTER_FILIAIS = "OBTER_FILIAIS";
    private static EmpresasDAO empresasDAO;

    /**
     * @param banco
     * @throws Exception
     */
    private EmpresasDAO(String banco) throws Exception {
        super(banco);
    }

    public static EmpresasDAO getEmpresaDAO() throws Exception {
        if (empresasDAO == null) {
            ResourceBundle bundle = ResourceBundle.getBundle(Constantes.CONFIG);
            empresasDAO = new EmpresasDAO(bundle.getString(Constantes.BANCO));
        }

        return empresasDAO;
    }

    public List obterEmpresas() throws Exception {
        Connection conn = null;
        List list = new ArrayList();

        try {
            conn = getConexao();
            list = preencheVO(conn, new EmpresaVO(), "empresa",
                    "EMPR_EMPRESA = EMPR_MATRIZ");
        } catch (Exception e) {
            throw e;
        } finally {
            liberaConeccao(conn);
        }

        return list;
    }

    public List obterFiliais(String empresa) throws Exception {
        Connection conn = null;
        List list = new ArrayList();

        try {
            conn = getConexao();
            list = preencheVO(conn, new EmpresaVO(), "empresa",
                    "EMPR_MATRIZ = '" + empresa + "'");
        } catch (Exception e) {
            throw e;
        } finally {
            liberaConeccao(conn);
        }

        return list;
    }

    public EmpresaVO obterEmpresa(String empresaId) throws Exception {
        Connection conn = null;
        List list = new ArrayList();

        try {
            conn = getConexao();
            list = preencheVO(conn, new EmpresaVO(), "empresa",
                    "EMPR_ID = " + empresaId);
        } catch (Exception e) {
            throw e;
        } finally {
            liberaConeccao(conn);
        }

        if (list.size() > 0) {
            return (EmpresaVO) list.get(0);
        } else {
            return null;
        }
    }

    public List obterEmpresaVO(EmpresaVO empresaVO) throws Exception {
        Connection conn = getConexao();

        try {
            return pesquisarVO(conn, empresaVO, "", "empresa");
        } finally {
            liberaConeccao(conn);
        }
    }

    public void salvarEmpresa(Empresa empresa, Object key)
        throws Exception {
        Connection connection = validarTransacao(key);
        inserirVO(connection, empresa, new String[] { "empr_id" });
    }

    public List pesquisarEmpresa(Empresa empresa) throws Exception {
        Connection connection = getConexao();

        try {
            String where = "";

            if (!Util.isNullOrEmpty(empresa.getEmpr_descricao())) {
                where += (" and empr_descricao like " +
                aspasLike(empresa.getEmpr_descricao()));
                empresa.setEmpr_descricao(null);
            }

            return pesquisarVO(connection, empresa, where);
        } finally {
            liberaConeccao(connection);
        }
    }

    public void atualizarEmpresa(Empresa empresa, Object key)
        throws Exception {
        Connection connection = validarTransacao(key);
        atualizarVO(connection, empresa, new String[] { "empr_id" });
    }

    public void excluirEmpresa(Empresa empresa, Object key)
        throws Exception {
        Connection connection = validarTransacao(key);
        excluirVO(connection, empresa);
    }
}
